home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-07-27 | 7.2 KB | 475 lines | [TEXT/MPS ] |
- MACHINE MC68040 ; Move16
- CASE OBJECT
-
- * INCLUDE 'Traps.a'
- INCLUDE 'Errors.a'
- INCLUDE 'Types.a'
- INCLUDE 'Memory.a'
- INCLUDE 'Resources.a'
- INCLUDE 'SegLoad.a'
-
- test_Globals RECORD ,DECR
- EXPORT %FP0,%FP1,%FP2,%FP3,%FP4,%FP5,%FP6,%FP7
- %FP0 DS.B 10
- %FP1 DS.B 10
- %FP2 DS.B 10
- %FP3 DS.B 10
- %FP4 DS.B 10
- %FP5 DS.B 10
- %FP6 DS.B 10
- %FP7 DS.B 10
- ENDR
-
- %MyBlockMove PROC EXPORT
- Move.L D0,D3
- Move.L A0,D1
- And.W #15,D1
- Move.L A1,D2
- And.W #15,D2
- Cmp.W D1,D2
- Bne @doTrap ; Move16 can't be applied
-
- Tst.W D1 ; address aligned to multiple of 16?
- Beq.s @1 ; yes => jump
-
- Moveq #16,D0 ; move bytes 'til next multiple of 16
- Sub.W D1,D0
- Sub.L D0,D3
- Bsr.S @copy0_15
-
- @1 Move.L D3,D0 ; compute number of Move16s
- And.L #15,D0
- Lsr.L #4,D3 ; D3:=D3 DIV 16
- Bra.S @decr
-
- @loop Move16 (A0)+,(A1)+
- @decr DBra D3,@loop
-
- ; move remaining bytes
- @copy0_15 Move.L D0,D1
- Add.L D0,D0
- Lsl.L #3,D1
- Add.L D0,D1
- Jmp (@copy0,D1)
- @copy0 Rts
- NOP
- NOP
- NOP
- NOP
- @copy1 Move.B (A0)+,(A1)+
- Rts
- NOP
- NOP
- NOP
- @copy2 Move.W (A0)+,(A1)+
- Rts
- NOP
- NOP
- NOP
- @copy3 Move.B (A0)+,(A1)+
- Move.W (A0)+,(A1)+
- Rts
- NOP
- NOP
- @copy4 Move.L (A0)+,(A1)+
- Rts
- NOP
- NOP
- NOP
- @copy5 Move.B (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Rts
- NOP
- NOP
- @copy6 Move.W (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Rts
- NOP
- NOP
- @copy7 Move.B (A0)+,(A1)+
- Move.W (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Rts
- NOP
- @copy8 Move.L (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Rts
- NOP
- NOP
- @copy9 Move.B (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Rts
- NOP
- @copy10 Move.W (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Rts
- NOP
- @copy11 Move.B (A0)+,(A1)+
- Move.W (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Rts
- @copy12 Move.L (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Rts
- NOP
- @copy13 Move.B (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Rts
- @copy14 Move.W (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Rts
- @copy15 Move.B (A0)+,(A1)+
- Move.W (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Move.L (A0)+,(A1)+
- Rts
-
- @doTrap _Blockmove
- Rts
- ENDPROC
-
- %saveFReg PROC EXPORT
- Move.L (A7)+,A0
- Move.L (A7)+,D1
- Clr.L D0
- Bra.S end1
-
- loop1 BTst D0,D1
- Beq.S go1
-
- Move.L D0,D2
- Muls.W #10,D2
- Lea (%FP0,A5,D2),A1
- Move.L (A1)+,-(A7)
- Move.L (A1)+,-(A7)
- Move.W (A1)+,-(A7)
-
- go1 Addq.W #$1,D0
-
- end1 Cmp.W #7,D0
- Ble.S loop1
- Jmp (A0)
- DC.B $80,'%saveFReg'
- ALIGN
- DC.W 0
- ENDP
-
- %restFReg PROC EXPORT
- Move.L (A7)+,A0
- Move.L (A7)+,D1
- Moveq #7,D0
- Bra.S end1
-
- loop1 BTst D0,D1
- Beq.S go1
-
- Move.L D0,D2
- Addq #1,D2
- Muls.W #10,D2
- Lea (%FP0,A5,D2),A1
- Move.W (A7)+,-(A1)
- Move.L (A7)+,-(A1)
- Move.L (A7)+,-(A1)
-
- go1 Subq #$1,D0
-
- end1 Tst D0
- Bge.S loop1
- Jmp (A0)
- DC.B $80,'%restFReg'
- ALIGN
- DC.W 0
- ENDP
-
- Runtime_RangeError PROC EXPORT
- LINK A6,#0
- PEA @message
- _DebugStr
- _ExitToShell
- UNLK A6
- RTD #8
- DC.B $80,'Runtime_RangeError'
- ALIGN
- DC @end-@message
- @message DC.B 'Invalid index'
- ALIGN
- @end
- ENDP
-
- Runtime_ConversionError PROC EXPORT
- LINK A6,#0
- PEA @message
- _DebugStr
- _ExitToShell
- UNLK A6
- Rts
- DC.B $80,'Runtime_ConversionError'
- ALIGN
- DC @end-@message
- @message DC.B 'Value too large for SHORTINT'
- ALIGN
- @end
- ENDP
-
- Runtime_NoReturn PROC EXPORT
- LINK A6,#0
- PEA @message
- _DebugStr
- _ExitToShell
- UNLK A6
- Rts
- DC.B $80,'Runtime_NoReturn'
- ALIGN
- DC @end-@message
- @message DC.B 'Function procedure without RETURN statement'
- ALIGN
- @end
- ENDP
-
- Runtime_TypeGuardFailure PROC EXPORT
- LINK A6,#0
- PEA @message
- _DebugStr
- _ExitToShell
- UNLK A6
- Rts
- DC.B $80,'Runtime_TypeGuardFailure'
- ALIGN
- DC @end-@message
- @message DC.B 'Type guard check failed'
- ALIGN
- @end
- ENDP
-
- Runtime_AssertFailure PROC EXPORT
- LINK A6,#0
- PEA @message
- _DebugStr
- _ExitToShell
- UNLK A6
- Rts
- DC.B $80,'Runtime_AssertFailure'
- ALIGN
- DC @end-@message
- @message DC.B 'Assertion failed'
- ALIGN
- @end
- ENDP
-
-
- Runtime_CaseError PROC EXPORT
- LINK A6,#-256
- LEA errString+2,A1
- MOVE.B (A1),D0
- EXT.W D0
- LEA -256(a6),A0
- loop MOVE.B (A1)+,(A0)+
- DBF D0,loop
- MOVE.B ([8,a6]),D1
- ADD.B D1,-256(a6)
- EXT.W D1
- LEA ([8,a6],1),A1
- loop2 MOVE.B (A1)+,(A0)+
- DBF D1,loop2
- MOVE.B -256(a6),D0
- EXT.W D0
- MOVE.W D0,-(a7)
- PEA -256(a6)
- _DebugStr
- _ExitToShell
- UNLK A6
- Rts
- DC.B $80,'Runtime_CaseError'
- ALIGN
- errString
- DC @end-@message
-
- @message DC.B 'Invalid case in CASE statement. Selector: '
- ALIGN
- @end
- ENDP
-
- Runtime_AllocateTagged PROC EXPORT
- MOVE.L ([4,A7]),D0
- ADDQ.L #4,D0
- _NewPtr
- BNE.S @return
- MOVE.L 4(A7),(A0)+
- @return MOVE.L A0,([8,A7])
- RTD #8
- DC.B $80,'Runtime_AllocateTagged'
- ALIGN
- DC 0
- ENDP
-
- Runtime_AllocateUntagged PROC EXPORT
- MOVE.L 4(A7),D0
- _NewPtr
- MOVE.L A0,([8,A7])
- RTD #8
- DC.B $80,'Runtime_AllocateUntagged'
- ALIGN
- DC 0
- ENDP
-
- IE_GETENV PROC EXPORT
-
- IMPORT (getenv):CODE
-
- Move.L 8(A7),-(A7)
- Jsr getenv
- Addq.L #4,A7
- Tst.L D0
- Beq.S @return
-
- Move.L 4(A7),A1
- Move.L D0,A0
- Move #255,D0
-
- @loop Move.B (A0)+,(A1)+
- DBeq D0,@loop
-
- Clr.B -(A1)
- Moveq #1,D0
-
- @return Move.B D0,12(A7) ; Pascal-Funktion: Returnvalue on Stack
- Rtd #8
- ENDP
-
- InitEnvironment PROC EXPORT
-
- IMPORT (__setjmp,_RTInit,InitTags):CODE
- IMPORT (IntEnv_ArgC,IntEnv_ArgV,IntEnv__EnvP):DATA
- IMPORT (_ArgC,_ArgV,_EnvP,__MyEnv):DATA
-
- CLR.L -(A7) ;pass C-strings
- PEA _EnvP
- PEA _ArgV
- PEA _ArgC
- MOVE.L $14(A7),-(A7)
- JSR _RTInit
- Move.L _EnvP,IntEnv__EnvP
- Move.L _ArgV,IntEnv_ArgV
- Move.L _ArgC,IntEnv_ArgC
-
- LEA $14(A7),A7
- PEA __MyEnv
- JSR __setjmp
- ADDQ.L #4,A7
- TST.L D0
- BNE.S @return
- JSR InitTags
- MOVEQ #0,D0
- Rts
-
- @error PEA @message
- MOVE #$FE15,D0
- _SysError
-
- @return ADDQ.L #$4,A7
- Rts
-
- @message DC.B 'Data initialization failed!'
- ENDP
-
- SEG '%OberonTags'
- InitTags PROC EXPORT
- MOVEM.L A2/A3,-(A7)
- CLR.L -(A7)
- MOVE.L #'CODE',-(A7)
- PEA @segmentName
- _GetNamedResource
- MOVEA.L (A7)+,A2
- MOVE.L (A2),D0
- DC.W $A055 ;_StripAddress
- MOVEA.L D0,A0
- ADDQ #4,A0
- MOVE.L A0,D2
- SUB.L baseAddress,D2
- TST.L baseAddress
- BNE.S @adjust
-
- LEA ConvertTags,A3
- BRA.S @doIt
-
- @adjust LEA AdjustTags,A3
-
- @doIt LEA baseAddress,A1
- MOVE.L A0,(A1)
- LEA InitTags,A1
- JSR (A3)
-
- MOVEA.L A2,A0
- _GetHandleSize
- ADD.L (A2),D0
- DC.W $A055 ;_StripAddress
- MOVEA.L D0,A1
- LEA EndOfModule,A0
- JSR (A3)
-
- @return MOVEM.L (A7)+,A2/A3
- Rts
- DC.B $80,'InitTags'
- DC.W ConvertTags-@segmentName
- @segmentName DC.B '%OberonTags'
- baseAddress DC.L 0
-
- ConvertTags Cmp.L A0,A1
- Beq.S @return
-
- @skip Cmp.W #$4EED,(A0) ; skip type-bound procedures
- Bne.S @begin
- Addq.L #4,A0
- Bra.S @skip
-
-
- @begin Addq.L #4,A0 ; skip record’s size
- Move.L (A0)+,D0 ; get number of pointers
-
- @convert Move 2(A0),D1
- Ext.L D1
- Add.L A0,D1
- Addq.L #2,D1
- Move.L D1,(A0)+
-
- @check DBra D0,@convert
- Bra.S ConvertTags
-
- @return Rts
- DC.B $80,'ConvertTags'
- ALIGN
- DC.W 0
-
- AdjustTags Cmp.L A0,A1
- Beq.S @return
-
- @skip Cmp.W #$4EED,(A0) ; skip type.bound procedures
- Bne.S @begin
- Addq.L #4,A0
- Bra.S @skip
-
- @begin Addq.L #4,A0 ; skip record’s size
- Move.L (A0)+,D0
-
- @convert Add.L D2,(A0)+
-
- @check DBra D0,@convert
- Bra.S AdjustTags
-
- @return Rts
- DC.B $80,'AdjustTags'
- ALIGN
- DC.W 0
- EndOfModule
- ENDP
-
- END